package org.fixies.spreadsheet.converter;

import org.apache.commons.beanutils.BeanUtils;
import org.fixies.spreadsheet.Cell;
import org.fixies.spreadsheet.Row;
import org.fixies.spreadsheet.Unit;
import org.fixies.utils.UnexpectedProblemException;

import java.util.Iterator;

/**
 * Bean-Listコンバータ抽象クラス
 *
 * @author Kawasaki
 * @param <E> Bean
 */
public abstract class AbstractBeanConverter<E> extends
        AbstractDataSetConverter<E> {

    /**
     * 変換する。
     */
    public final E convert(Unit unit) {

        Iterator<Row> itr = unit.iterator();
        if (!itr.hasNext()) return null;

        // 一行目は見出し（キー）
        Row midashi = itr.next();
        if (!itr.hasNext()) return null;

        Row data = itr.next();
        E bean = createNewBean();
        for (int i = 0; i < midashi.size(); i++) {
            Cell key = midashi.get(i);
            Cell value = data.get(i);
            setProperty(bean, key, value);
        }
        return bean;
    }

    protected final void setProperty(E bean, Cell key, Cell value) {
        try {
            BeanUtils.setProperty(bean, key.asString(), value.asString());
        } catch (Exception e) {
            throw new UnexpectedProblemException(e);
        }
    }

    /**
     * 新しいJavaBeanインスタンスを生成する。
     *
     * @return 新しいJavaBeanインスタンス
     */
    protected abstract E createNewBean();
}
